/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package acceso.servlet;

/**
 *
 * @author john
 */
import wf.dto.geocon.GeocapDto;
import wf.dto.geocon.GeocapvalDto;
import wf.dto.geocon.GeoconDto;
import wf.dto.pbarcadj;
import wf3.gps.Agrupamiento;
import wf3.gps.Escenario;
import wf3.gps.Filtro;
import wf3.gps.PunConfig;
import wf3.gps.Thread_markers;
//import acceso.dto.geocon.GeocapDto;
//import acceso.dto.geocon.GeocapvalDto;
//import acceso.dto.geocon.GeoconDto;
//import acceso.dto.pbarcadj;
//import acceso.dto.pbgpsselect;
//import acceso.gps.Agrupamiento;
//import acceso.gps.Escenario;
//import acceso.gps.Filtro;
//import acceso.gps.PunConfig;
//import acceso.gps.Thread_markers;
import acceso.hibernate.AQuery;
import acceso.hibernate.AccesoHibernate;
import acceso.util.Escritor;
import com.google.gson.Gson;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.StatelessSession;
import org.imgscalr.Scalr;
import wf.dto.geo.ValentDto;
import wf3.core.Contenedor;
//import wf3.core.GConten;
import wf3.core.cnt.GConten;
import wf3.geo.Entgeo;
import wf3.geo.GArea;
import wf3.geo.GCirculo;
import wf3.geo.GLinea;
import wf3.geo.GPunto;
import wf3.geo.Grafo;
import wf3.geo.Punto;

/**
 *
 * @author john
 */
public class Workgeo_Post extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = null;
        try {
            int accion = Integer.parseInt(request.getParameter("xact"));
            switch (accion) {
                case 1: {
                    //cambio capa
                    out = response.getWriter();

                    GeoconDto geocon = (GeoconDto) request.getSession().getAttribute("c" + request.getParameter("id_frawor"));
                    int nu_geocap = Integer.parseInt(request.getParameter("nu_geocap"));
                    GeocapDto capa_sel = null;
                    for (int i = 0; i < geocon.getL_capas().size(); i++) {
                        capa_sel = (GeocapDto) geocon.getL_capas().get(i);
                        if (nu_geocap == capa_sel.getId().getNu_geocap()) {
                            break;
                        } else {
                            capa_sel = null;
                        }
                    }
                    Gson g = new Gson();
                    out.print(g.toJson(capa_sel.getL_capVal()));
                    break;
                }
                case 2: {
                    //obtener configuracion
                    out = response.getWriter();

                    GeoconDto geocon = (GeoconDto) request.getSession().getAttribute("c" + request.getParameter("id_frawor"));
                    int nu_geocap = Integer.parseInt(request.getParameter("nu_geocap"));
                    int nu_geocapval = Integer.parseInt(request.getParameter("nu_geocapval"));

                    GeocapDto capa_sel = null;
                    GeocapvalDto capaval_sel = null;
                    for (int i = 0; i < geocon.getL_capas().size(); i++) {
                        capa_sel = (GeocapDto) geocon.getL_capas().get(i);
                        if (nu_geocap == capa_sel.getId().getNu_geocap()) {
                            for (int j = 0; j < capa_sel.getL_capVal().size(); j++) {
                                capaval_sel = (GeocapvalDto) capa_sel.getL_capVal().get(j);
                                if (nu_geocapval == capaval_sel.getId().getNu_geocapval()) {
                                    break;
                                } else {
                                    capaval_sel = null;
                                }
                            }
                            break;
                        } else {
                            capa_sel = null;
                        }
                    }
                    Gson g = new Gson();
                    out.print(g.toJson(capaval_sel.getL_punCap()));
                    break;
                }
                case 3: {
                    //obtener punconfig del agrupamiento seleccionado
                    out = response.getWriter();

                    GConten geocon = (GConten) request.getSession().getAttribute(request.getParameter("id_frawor"));
                    int nu_geocapval = Integer.parseInt(request.getParameter("nu_geocapval"));
                    int il_select = Integer.parseInt(request.getParameter("il_select"));
                    List<PunConfig> l_punconfig = null;

                    if (geocon.getPortafolio() != null) {
                        if (il_select == 0) {
                            geocon.getPortafolio().deseleccionar_agrupamiento(nu_geocapval);
                        } else {
                            geocon.getPortafolio().seleccionar_agrupamiento(nu_geocapval);
                        }

                        for (Agrupamiento a : geocon.getPortafolio().getFiltro_selec().getL_agrupa()) {
                            if (nu_geocapval == a.getNu_geocapval()) {
                                l_punconfig = a.getL_config();
                            }
                        }
                    } else {
                        if (il_select == 0) {
                            geocon.getEscenario_mostrar().deseleccionar_agrupamiento(nu_geocapval);
                        } else {
                            geocon.getEscenario_mostrar().seleccionar_agrupamiento(nu_geocapval);
                        }

                        for (Agrupamiento a : geocon.getEscenario_mostrar().getFiltro_selec().getL_agrupa()) {
                            if (nu_geocapval == a.getNu_geocapval()) {
                                l_punconfig = a.getL_config();
                            }
                        }
                    }

                    Gson g = new Gson();
                    out.print(g.toJson(l_punconfig));
                    break;
                }
                case 4: {
                    //obtener marker-icon y guardarlo
                    out = response.getWriter();

                    String size = request.getParameter("size");
                    String color = request.getParameter("color");

                    URL url = new URL("http://chart.apis.google.com/chart?chst=d_map_spin&chld=" + size + "|0|" + color + "|8|_|");
                    InputStream is = url.openStream();

                    OutputStream os = new FileOutputStream(getServletContext().getRealPath("/") + "img/gps/markers/" + color + "_" + size + ".png");

                    byte[] b = new byte[2048];
                    int length;

                    while ((length = is.read(b)) != -1) {
                        os.write(b, 0, length);
                    }

                    is.close();
                    os.close();

                    Thread th = new Thread(new Thread_markers(color, getServletContext().getRealPath("/") + "img/gps/markers/"));
                    th.start();

                    out.print("ok");
                    break;
                }
                case 5: {
                    //obtener imagen menos pesada del expediente
                    out = response.getWriter();

                    int co_expedi = Integer.parseInt(request.getParameter("co_expedi"));

                    StatelessSession HSESSION = null;
                    List l_img = null;
                    try {
                        HSESSION = AccesoHibernate.getSessionFactory().openStatelessSession();
                        AQuery IHQUERY = new AQuery(HSESSION.getNamedQuery("georef.pfimgexp"));
                        IHQUERY.setInteger("p_co_expedi", co_expedi);
                        l_img = IHQUERY.getMquery2(2).list();
                    } catch (Exception ep) {
                        throw ep;
                    } finally {
                        HSESSION.close();
                    }

                    Gson g = new Gson();
                    out.print(g.toJson(l_img));

                    break;
                }
                case 6: {
                    //obtener imagen menos pesada del expediente
                    response.setContentType("image/jpeg");
                    int id_arcadj = Integer.parseInt(request.getParameter("id_arcadj"));

                    StatelessSession HSESSION = null;
                    pbarcadj arcadj;
                    try {
                        HSESSION = AccesoHibernate.getSessionFactory().openStatelessSession();
                        AQuery IHQUERY = new AQuery(HSESSION.getNamedQuery("arcadj.pbarcadj"));
                        IHQUERY.setInteger("p_id_arcadj", id_arcadj);
                        arcadj = (pbarcadj) IHQUERY.getMquery2(2).uniqueResult();
                    } catch (Exception ep) {
                        throw ep;
                    } finally {
                        HSESSION.close();
                    }

                    String nombre_a = arcadj.getId_arcadj() + arcadj.getNo_arcadj().substring(arcadj.getNo_arcadj().indexOf("."), arcadj.getNo_arcadj().length());

                    DateFormat year = new SimpleDateFormat("yyyy");
                    DateFormat month = new SimpleDateFormat("MM");
                    DateFormat day = new SimpleDateFormat("dd");
                    Date date = arcadj.getFe_arcadj();
                    String pre_url = "/backup/WFACR/DOCUMENTOS/" + year.format(date) + "/" + month.format(date) + "/" + day.format(date) + "/" + nombre_a;

                    //BufferedImage image = ImageIO.read(new File(pre_url));
                    //BufferedImage image = ImageIO.read(new File("/home/john/Pictures/old_stratocaster.jpg"));
                    URL url = new URL("http://wf1.accesocrediticio.com/acceso/workflow2/view_load4.jsp?tipo=T&file=" + id_arcadj);
                    InputStream is = url.openStream();
                    BufferedImage image = ImageIO.read(is);
                    //BufferedImage scaledImg = Scalr.resize(image, Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, 100, 50, null);
                    BufferedImage scaledImg = Scalr.resize(image, 100);

                    ImageIO.write(scaledImg, "jpg", response.getOutputStream());
                    is.close();

                    break;
                }
                case 7: {
                    //obtener el agrupamiento del punto en otros filtros
                    out = response.getWriter();
                    GConten geocon = (GConten) request.getSession().getAttribute(request.getParameter("id_frawor"));
                    int id_pungeo = Integer.parseInt(request.getParameter("id_pungeo"));
                    String json = "[";

                    for (int i = 0; i < geocon.getL_filtro().size(); i++) {
                        Filtro filtro = geocon.getL_filtro().get(i);
                        json += "{\"filtro\":\"" + filtro.getNo_geocap() + "\",\"agrupamiento\":\"";
                        for (Agrupamiento agrupamiento : filtro.getL_agrupa()) {
                            boolean encontro = false;
                            for (PunConfig punto : agrupamiento.getL_config()) {
                                if (id_pungeo == punto.getId_pungeo()) {
                                    json += agrupamiento.getNo_agrupa() + "\"}";
                                    encontro = true;
                                    break;
                                }
                            }
                            if (encontro) {
                                break;
                            }
                        }
                        if (geocon.getL_filtro().size() - 1 != i) {
                            json += ",";
                        }
                    }
                    json += "]";

                    out.print(json);
                    break;
                }
                case 8: {
                    out = response.getWriter();

                    GConten geocon = (GConten) request.getSession().getAttribute(request.getParameter("id_frawor"));
                    List<Escenario> escs = geocon.getL_escenarios();
                    out.println("escenarios: " + escs.size() + "<br>");
                    for (Escenario e : escs) {
                        out.println("&nbsp;&nbsp;escenario: " + e.getFiltro_selec().getNo_geocap() + "<br>");
                        for (Filtro f : e.getL_filtros_disponibles()) {
                            out.println("&nbsp;&nbsp;&nbsp;&nbsp;filtro: " + f.getNo_geocap() + "<br>");
                            for (Agrupamiento a : f.getL_agrupa()) {
                                out.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;agrupamiento: " + a.getNo_agrupa() + " puntos: " + a.getL_config().size() + "<br>");
                            }
                        }
                    }
                    break;
                }
                case 9: {
                    //obtener punconfig del agrupamiento seleccionado
                    out = response.getWriter();

                    GConten geocon = (GConten) request.getSession().getAttribute(request.getParameter("id_frawor"));
                    int nu_geocapval = Integer.parseInt(request.getParameter("nu_geocapval"));
                    List<PunConfig> l_punconfig = null;

                    if (geocon.getPortafolio() != null) {
                        for (Agrupamiento a : geocon.getPortafolio().getFiltro_selec().getL_agrupa()) {
                            if (nu_geocapval == a.getNu_geocapval()) {
                                l_punconfig = a.getL_config();
                            }
                        }
                    } else {
                        for (Agrupamiento a : geocon.getEscenario_mostrar().getFiltro_selec().getL_agrupa()) {
                            if (nu_geocapval == a.getNu_geocapval()) {
                                l_punconfig = a.getL_config();
                            }
                        }
                    }

                    Gson g = new Gson();
                    out.print(g.toJson(l_punconfig));
                    break;
                }
                case 10: {
                    //grabar objeto
                    GConten geocon = (GConten) request.getSession().getAttribute(request.getParameter("id_frawor"));
                    String modo = request.getParameter("modo");
                    ObjectOutputStream salida;

                    if (modo.equals("1")) {
                        //guardar
                        salida = new ObjectOutputStream(new FileOutputStream("/home/john/Desktop/media.gps"));
                        salida.writeObject(geocon);
                        salida.close();
                    } else if (modo.equals("2")) {
                        //guardar como
                    }



                    break;
                }
                case 11: {
                    //abrir objeto
//                    GConten geocon = (GConten)request.getSession().getAttribute(request.getParameter("id_frawor"));

                    ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("/home/john/Desktop/media.obj"));
                    Contenedor geocon = (Contenedor) entrada.readObject();
                    entrada.close();

                    System.out.println("GConten: " + geocon);
                    request.getSession().setAttribute("" + request.getParameter("id_frawor"), geocon);
                    break;
                }
                case 12: {
                    out = response.getWriter();
                    //abrir objeto
//                    GConten geocon = (GConten)request.getSession().getAttribute(request.getParameter("id_frawor"));
                    int p_co_entgeo = Integer.parseInt(request.getParameter("p_co_entgeo"));
                    int p_id_frawor = Integer.parseInt(request.getParameter("p_id_frawor"));
                    int p_co_congeo = Integer.parseInt(request.getParameter("p_co_congeo"));
                    Character p_ti_entgeo = request.getParameter("p_ti_entgeo").charAt(0);

                    StatelessSession HSESSION = null;
                    try {
                        HSESSION = AccesoHibernate.getSessionFactory().openStatelessSession();
                        AQuery IHQUERY = new AQuery(HSESSION.getNamedQuery("frawor2.pgvalent"));
                        IHQUERY.setInteger("p_co_entgeo", p_co_entgeo);
                        IHQUERY.setInteger("p_id_frawor", p_id_frawor);
                        IHQUERY.setInteger("p_co_congeo", p_co_congeo);
                        System.out.println("" + IHQUERY.getQuery());
                        List<ValentDto> valentdtos = IHQUERY.getMquery().list();
                        Entgeo entgeo = new Entgeo();
                        entgeo.setCo_entgeo(p_co_entgeo);
                        entgeo.setTi_entgeo(p_ti_entgeo);
                        switch (p_ti_entgeo) {
//                        switch (entgeo.getTi_entgeo()) {
                            case 'P': {
                                for (ValentDto valentdto : valentdtos) {
                                    Grafo grafo = new GPunto(valentdto, 'P');
                                    entgeo.add_Grafos(grafo);
                                }
                                break;
                            }
                            case 'A': {
                                List<Punto> puntos = new ArrayList<>();
                                Grafo grafo = null;
                                ValentDto valentdto1 = valentdtos.get(0);
//                                System.out.println("Valent size:"+valentdtos.size());
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));
                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
//                                        puntos.add(new Punto(valentdto1));
//                                        System.out.println("grafo:"+puntos.size());
                                        grafo = new GArea(new ArrayList<>(puntos), 'A', valentdtos.get(0));
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList<>();
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() > 0) {
                                    // puntos.add(new Punto(valentdto1));
                                    grafo = new GLinea(new ArrayList<>(puntos), 'A', valentdtos.get(0));
                                    entgeo.add_Grafos(grafo);
                                }

                                break;
                            }
                            case 'L': {
                                System.out.println("Generando LInea");
                                List<Punto> puntos = new ArrayList<>();
                                Grafo grafo = null;
                                ValentDto valentdto1 = valentdtos.get(0);
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));
                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
                                        grafo = new GLinea(new ArrayList<>(puntos), 'L', valentdtos.get(0));
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList<>();
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() > 0) {
                                    puntos.add(new Punto(valentdto1));
//                                    System.out.println("Puntos size:"+puntos.size());
                                    grafo = new GLinea(new ArrayList<>(puntos), 'L', valentdtos.get(0));
                                    entgeo.add_Grafos(grafo);
                                }
                                break;
                            }
                            case 'C': {
                                for (ValentDto valentdto : valentdtos) {
//                                    Grafo grafo = new GCirculo(valentdto, 'C');
//                                    entgeo.add_Grafos(grafo);
                                    entgeo.add_Grafos(new GCirculo(valentdto, 'C'));
                                }
                                break;
                            }
                            default: {
                            }
                        }
//                        System.out.println("|servlet response:" + new Gson().toJson(entgeo));
                        out.print(new Gson().toJson(entgeo));
                    } catch (Exception ep) {
                        throw ep;
                    } finally {
                        HSESSION.close();
                    }

                    break;
                }
            }

        } catch (Exception ep) {
            Escritor.escribe_errors("[W]ep:" + ep.getClass() + "::" + ep.getMessage());
        } finally {
            try {
                out.close();
            } catch (Exception ex) {
            }

        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}